¿Qué es el software libre?
“Free software as in free speech, not free beer”
por Antonio Gallego de Torres, autor del libro "Enrutadores Cisco".
¿Qué es el Software Libre? (Open/Free Software)
El software libre o abierto son programas de ordenador
que se distribuyen libremente. Esto significa (1) que las instrucciones que
componen el programa (el código fuente) están disponibles para su estudio y
cambio y (2) que son gratuitos (al menos en los términos generales que
matizaremos después).
(1) el código fuente del programa está disponible para su estudio y
manipulación: Se puede cambiar el programa y volver a distribuirlo, siempre que
al ponerlo de nuevo en circulación se haga en las mismas condiciones de
gratituidad y libre disposición del código fuente en las que se encontraba antes
(en definitiva, que siga siendo software libre). Esto se traduce en que
programadores de todo el mundo pueden estudiar los programas, corregir errores,
añadir funciones a los mismos o adaptarlos para resolver nuevos problemas.
(2) son gratuitos: el software abierto/libre se puede conseguir (al menos en su
forma de código 'fuente') de forma gratuita, pagando sólo los gastos del soporte
en el que se entrega, como por ejemplo un CD, o bajándolo directamente de
Internet. En términos generales las licencias de distribución de software libre
(por ejemplo la licencia GNU/GPL) no obligan a distribuir el programa gratis,
pero permiten que cualquiera pueda hacerlo al precio que le venga en gana. Esto
se traduce en que al final sólo se cobran los soportes, los costes de
distribución
Vemos a continuación qué son los programas y sus distintas presentaciones
(código fuente, binarios) para terminar explicando la diferencia fundamental
entre software abierto y software cerrado.
¿Qué son los programas de ordenador?
Son las instrucciones que permiten al ordenador realizar una función. Un
ordenador es una máquina que sigue una lista de instrucciones y realiza una
tarea. Para comunicarse con el exterior tiene instrucciones que toman
información (del teclado, ratón, discos...) y otras que le permiten sacar
información (a una impresora, a una pantalla, a unos altavoces, a otro
ordenador...). Típicamente un programa de ordenador toma una serie de datos (con
las instrucciones de entrada), procesa la información (con instrucciones u
operadores lógicos y aritméticos) y manda el resultado (con las instrucciones de
salida) a un dispositivo donde podemos percibir el resultado.
Los ordenadores representan internamente toda la información (tanto la de los
programas como la de los datos que los programas manipulan) usando dos estados:
unos y ceros. Cómo son máquinas electrónicas, representan los ceros y unos con
un voltaje (por ejemplo en tecnología TTL un cero son cero voltios y un uno son
5 voltios). Lo que a nosotros nos interesa es que internamente representan los
programas y los datos como tiras de unos y ceros, de forma que la memoria de un
ordenador puede presentar un aspecto similar al siguiente:
101001010101011011110101001010110101100101010100
010101001010100010101000010111010101010101010100
101010110100101101001010111010101101001010101011 etc...
Recuerda: el ordenador es una máquina, de forma que los unos y ceros estarán
representados por campos magnéticos (memorias, discos), voltajes (señales
viajando entre componentes), etc... Los componentes del ordenador van leyendo
esas tiras de unos y ceros, las agrupan y las van interpretando. Programar
ordenadores introduciendo unos y ceros es una tarea extremadamente compleja,
propensa a errores y muy poco productiva. Uno de los primeros programas de
ordenador que los ingenieros escribieron fue el ensamblador/desensamblador, un
programa que realiza una traducción literal de los códigos de las instrucciones
básicas del ordenador (el lenguaje ensamblador) en las tiras de unos y ceros que
el ordenador entiende (el lenguaje máquina). El aspecto de un programa en
ensamblador es el siguiente:
| DIRECCION DE MEMORIA 0C5A:010A 0C5A:010D 0C5A:010F 0C5A:0111 0C5A:0113 0C5A:0117 0C5A:0119 0C5A:011A 0C5A:011B 0C5A:011E 0C5A:011F |
CONTENIDO EN Base16 (HEXADECIMAL) E8FCCC 740A 3C0D 7406 3A06D59A 75F0 4E C3 BF3400 49 0CFE |
INSTRUCCIONES y PARAMETROS CALL CE09 |
El programa en código máquina aparece representado en la segunda columna, sólo
que en vez de en binario (unos y ceros) en hexadecimal (base 16), para que ocupe
menos espacio. El programa equivalente escrito en forma simbólica, no numérica,
viene en la tercera columna. Hay una correspondencia directa entre ambas
columnas. El programa ensamblador traduce la tercera columna en la segunda, y el
desensamblador convierte la segunda columna en la tercera. La primera columna
representa la posición de la memoria donde se almacena la información (el
programa y los datos). Aun así, los programas en ensamblador siguen siendo muy
difíciles de escribir, dependen de la máquina y una vez escritos, de entender.
El siguiente paso fue desarrollar traductores mas sofisticados, que tomaran un
fichero escrito en un lenguaje más similar al natural, en el que expresar ideas
más complejas (ideas lógicas y matemáticas). Los primeros lenguajes 'de alto
nivel' fueron el Fortran y el LISP. Lenguajes modernos son el Java, el C/C++,
SQL, Perl y Python. Hay cientos de lenguajes. El aspecto de un programa escrito
en Perl es el siguiente
#!/usr/bin/perl -w
for ($i=0 ; $i<=100 ;$i++) {
print $i,"\t",cuad($i),"\t",fact($i),"\n";
}
sub cuad {
return $_[0]*$_[0];
}
sub fact {
if ($_[0]<=1) {
return 1;
} else {
return $_[0]*fact($_[0]-1);
}
}
Un programa especial (denominado compilador o intérprete) traduce estos bloques
de código 'de alto nivel' (el código fuente) en las tiras de unos y ceros que el
ordenador entiende (el código máquina o los binarios). El programador puede
concentrarse en pensar en la función del programa (pensar en el diseño, los
algoritmos, la lógica del programa), codificar el programa en un lenguaje de
alto nivel (como el Java o el perl) y dejar que el ordenador traduzca sus ideas
en programas binarios que producen resultados reales (que hacen que la
circuitería del ordenador trabaje). De esta forma un programa escrito en este
tipo de lenguaje es más fácil de portar a otras máquinas.
Es importante comprender que la operación contraria (generar a partir de un
fichero binario el código fuente) es muy difícil de realizar, y prácticamente
imposible de automatizar (es lo que en matemáticas se denomina 'funciones de una
sólo vía'). Hay gente muy lista que es capaz de examinar sistemas complejos
(como un motor, o un programa escrito en lenguaje máquina) y deducir cómo
funcionan y cómo han sido diseñados y fabricados. A este proceso se le denomina
'ingeniería inversa'. Pero es un proceso muy laborioso, bastante artesanal, que
exige mucha pericia y que es casi imposible de mecanizar.
Ahora podemos entender la diferencia entre código abierto y cerrado: un programa
cerrado se distribuye en forma binaria (un archivo de unos y ceros). En general
no se permite cambiarlo, ni redistribuirlo, se dan pocos detalles de su
funcionamiento interno, en muchos casos se prohíbe explícitamente la ingeniería
inversa sobre el producto y si construimos otros sistemas que dependan de un
producto cerrado corremos el riesgo de que el fabricante cambie en un futuro (a
veces adrede) los detalles internos de funcionamiento y que deje nuestros
productos inservibles (por haber sido construidos sobre su sistema y depender de
su estructura interna). Esto es especialmente grave cuando afecta al sistema
operativo, el programa básico que hace que un ordenador arranque y espere
nuestras instrucciones. Si uno quiere escribir programas para un sistema
operativo cerrado debe 'pasar por el aro' del fabricante, usar las herramientas
que este le proporciona, de la forma que este le dice. Los servicios que un
sistema operativo cerrado proporciona están disponibles para el fabricante antes
que para el resto de la comunidad de programadores de aplicaciones, con la
ventaja competitiva que esto supone.
En cambio el software libre se distribuye tanto en forma binaria (para que
podamos empezar a usarlo inmediatamente) como en su forma lógica (el código
fuente), de forma que podemos estudiar el programa, modificarlo (si nos interesa
o nos atrevemos), compilar nosotros mismos el código y generar un fichero
binario de nuestra confianza. Además, al conocer la estructura interna podemos
diseñar sistemas que se integren perfectamente con el software libre.
¿Qué es GNU/Linux?
Es un clon de UNIX (un sistema operativo) que a principios de los 90 un
estudiante Finlandés llamado Linus Torvalds empezó a escribir como parte de su
proyecto de fin de carrera. Hizo algo muy notable: a medida que lo iba
escribiendo lo 'colgaba' de Internet. Rápidamente empezó a coordinar a decenas
de calaboradores desinteresados de todo el mundo. Para simplificar lo llamaremos
Linux. Ahora Linux es el ejemplo más notable de Software libre, pero hay muchos
otros proyectos cuya filosofía es similar.
Actualmente Linus Torvalds sigue siendo el arquitecto principal de Linux, vive
en California, USA, y hasta hace poco trabajaba en la empresa de microchips
Transmeta. De aspecto tiene un aire a Bill Gates. El parecido se queda ahí. El
principal mantenedor junto con Torvalds de la parte crítica de Linux, (el núcleo
o kernel) es un brasileño de 19 años, Marcelo Tossati. El anterior en su puesto fue el
galés Alan Cox. Otros ilustres contribuyentes al Open Source son Richard
Stallman, el mexicano Miguel de Icaza (Gnome), Donald Becker (que trabaja en
la NASA y en sus ratos libres escribió los módulos de red Ethernet y ahora
desarrolla los sistemas paralelos denominados Beowulf), y cientos de
programadores más.
Otros ejemplos de software libre: Sistema operativos (GNU/HURD, Linux,
FreeBSD...), programas de diseño (GIMP), Servidores de Internet (Apache),
Servidores de Correo (Sendmail), Bases de datos (MySQL), Herramientas para
programar en la mayoría de los lenguajes de programación (compiladores,
intérpretes, enlazadores, ensambladores), toda clase de herramientas de
seguridad y telecomunicaciones (nmap, ethereal, tcpdump, whisker...), entornos
de ventanas tipo windows (Gnome, KDE, Windows Maker…), etc... etc...
PARA PROBAR LINUX: Hay muchas distribuciones (Red Hat, Mandrake, Debian,
SuSe, Linex), pero todas se basan en el kernel de Linux. Una de las
distribuciones más sencillas para empezar es la Knoppix, (metes un CD en el PC,
lo reinicias y automáticamente carga el Linux, con la ventaja de que al final
apagas el ordenador y queda todo como estaba).
PARA EMPEZAR A PROGRAMAR: Python es un magnífico lenguaje para empezar.
Linux está escrito básicamente en C. Tienes dos libros muy buenos en español
sobre Python y C en esta
página.
PREGUNTAS FRECUENTES
¿Qué significa GNU? Es el acrónimo recursivo de “GNU No es Unix”
¿Quién manda en el mundo del Software Libre? Nadie.
¿Quién organiza un proyecto de Software Libre? Buenos técnicos, 'elegidos' por
su prestigio, que además son buenos gestores. Lo hacen en sus ratos libres (en
sus otros ratos algunos trabajan en sitios como la NASA).
¿Por qué no lo venden y se hacen ricos? No lo hacen por dinero, sino por el
prestigio de la comunidad 'hacker'. Además, por dinero es imposible competir con
las grandes empresas (la llamada barrera de entrada)
¿Cómo se hace dinero? Los programadores de sistemas como Linux encuentran
trabajo en todos lados.
¿Cómo se hace más dinero? Hay empresas que venden servicios alrededor del
software libre (cobran por instalarlo, enseñar a usarlo, mantenerlo, ampliarlo,
adaptarlo...). Empresas como IBM están haciendo muy buen negocio prestando servicios sobre Linux.
¿Ahora que han tenido éxito, no pueden cambiar de idea y cerrar los sistemas? No
hay marcha atrás, la licencia es muy clara.
¿Y si los programadores se cansan de regalar su esfuerzo? No parece que vaya a
ocurrir. Además, vendrían otros. Quizás tú.
E-mail: redesyseguridad[ARROBA]gmail[PUNTO]com-- First Edition: Feb 15th, 2004 -- Last modified: Feb 18th, 2004